package code.c02_list.javaApp;

import java.util.*;

/**
 * @author thinkpad - 83start
 * @version v1.0
 * @create 2022/9/11 21:12
 * @package code.c02_list.classwork
 * @description ArrayList 实现 线性表的顺序存储结构
 */

public class ArrayListClass {
    public static void main(String[] args) {

        // ============================ 构造方法 ===========================================
        // 构建一个初始容量为10 的空列表
        ArrayList arrayList1 = new ArrayList<>();

        // 构建一个具有指定初始容量的空列表
        int initialCapacity = 40;
        ArrayList<Object> arrayList2 = new ArrayList<>(initialCapacity);

        // 构建一个包含指定集合的元素的列表
        Integer[] initialArrays = {1, 3, 4, 5, 5, 5, 6};
        ArrayList<Integer> arrayList3 = new ArrayList<Integer>(Arrays.asList(initialArrays));

        // ============================ 主要方法 ===========================================
        // 判断列表是否为空,如果没有元素返回true
        boolean empty = arrayList3.isEmpty();
        System.out.println("isEmpty == " + empty);

        // 返回此列表中的元素数量
        int size = arrayList3.size();
        System.out.println("size() == " + size);

        // 向列表的尾部添加指定元素
        boolean add = arrayList3.add(4);
        System.out.println("add() == " + add);

        // 在列表的指定位置插入指定元素
        arrayList3.add(4, 5);

        // 如果列表中包含指定元素，则返回true
        boolean contains = arrayList3.contains(6);
        System.out.println("contains == " + contains);

        // 返回列表中指定位置的元素
        Integer get = arrayList3.get(5);
        System.out.println("get == " + get);

        // 用指定元素替换列表中指定位置的元素
        Integer set = arrayList3.set(5, 8);
        System.out.println("set == " + set);

        // 返回此列表中第一次出现指定圆度的索引。如果没有此元素，则返回 -1
        int i = arrayList3.indexOf(4);
        System.out.println("indexOf() == " + i);

        // 返回此列表中最后出现的指定元素的索引，如果不存在这个元素，则返回 -1
        int i1 = arrayList3.lastIndexOf(0);
        System.out.println("lastIndexOf() == " + i1);

        //移除列表中指定位置的元素
        Integer remove = arrayList3.remove(4);
        System.out.println("remove(index) == " + remove);

        // 移除列表中第一次出现指定元素
        boolean remove1 = arrayList3.remove(new Integer(4));
        System.out.println("remove(Object o) == " + remove1);

        // 从列表中移除所有的元素
        arrayList3.clear();

        // ============================ 实现排序 ===========================================
        // 基本数据类型实现 正序 和 倒序
        Integer[] sortArr = {4, 3, 2, 1, 2, 32, 4, 5, 3, 77, 3, 2, 3, 88, 6, 89, 6, 7, 67, 67, 6, 7, 83};
        ArrayList<Integer> sortList = new ArrayList<>(Arrays.asList(sortArr));

        Collections.sort(sortList);
        System.out.println("顺序表正序排列：" + sortList);

        Collections.sort(sortList,Collections.reverseOrder());
        System.out.println("顺序表倒序排列：" + sortList);

        // 复杂数据类型 实现排序的三个方法
        // 方法1：在类型中重写comparable 排序接口

        // 方法2：设置 Comparator 比较器接口
        ArrayList<Teacher> teacherList = new ArrayList<>();
        teacherList.add(new Teacher("曹俊",2020135134));
        teacherList.add(new Teacher("陈工",2020135133));

        // tips: 如果要使用 compareTo方法，则不能使用基本数据类型
        Collections.sort(teacherList, new Comparator<Teacher>() {
            @Override
            public int compare(Teacher o1, Teacher o2) {
                if (o1.gettNo() > o2.gettNo()){
                    return 1;
                }else if (o1.gettNo() == o2.gettNo()){
                    return 0;
                }else {
                    return -1;
                }
            }
        });

        // 方法3：调用ArrayList类中的sort方法
        // 正序
        teacherList.sort(Comparator.comparing(Teacher::gettNo));
        // 倒序
        teacherList.sort(Comparator.comparing(Teacher::gettNo).reversed());
        // 比较多个值时
        teacherList.sort(Comparator
                .comparing(Teacher::gettName)
                .thenComparing(Teacher::gettNo));

    }
}

/**
 * 定义一个学生类，并实现 Comparable 接口，以学号排序
 */
class Student implements Comparable<Student>{
    String sName;
    String sNo;


    @Override
    public int compareTo(Student o) {
        return this.sNo.compareTo(o.sNo);
    }
}

class Teacher{
    String tName;
    int tNo;

    // 构造方法
    public Teacher(String tName, int tNo) {
        this.tName = tName;
        this.tNo = tNo;
    }

    public String gettName() {
        return tName;
    }

    public void settName(String tName) {
        this.tName = tName;
    }

    public int gettNo() {
        return tNo;
    }

    public void settNo(int tNo) {
        this.tNo = tNo;
    }


}
